#include <maureen/test.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

Function func_head, *func_tail = &func_head;
struct FunctionInfo func_info; //将变量定义放在源文件中，而将声明放在头文件中使用extern修饰(因为头文件中也要使用该变量），以避免重复定义

int RUN_ALL_TESTS() {
    for (struct LinkNode *ptr = func_head.link_node.next; ptr; ptr = ptr->next) {
        Function *func = (Function *)ptr;
        printf(GREEN("[====RUN====]") RED_HL(" %s") "\n", func->func_name);
        func_info.total = 0;
        func_info.success = 0;
        func->func();
        double rate = 100 * func_info.success / func_info.total;
        printf(GREEN("[  "));
        if (fabs(rate - 100.0) < 1e-6) {
            //%6.2lf%%: 占6位，保留小数点后2位的百分数，两个百分号显示为一个%，显示为`xxx.xx%`。
            printf(BLUE_HL("%6.2lf%%"), rate);
        } else {
            printf(RED_HL("%6.2lf%%"), rate);
        }
        printf(GREEN("  ]") " total:%d  success:%d\n", func_info.total, func_info.success);
    }

    return 0;
}

void add_function(TestFunc func, const char *func_name) {
    //链表的插入
    Function *temp = (Function*)calloc(1, sizeof(Function));
    temp->func = func;
    temp->func_name = strdup(func_name);
    func_tail->link_node.next = &(temp->link_node);
    func_tail = temp;
    return ;
}
